package encheres.presentation.ui;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import encheres.exceptions.EncheresUIException;
import encheres.manager.corba.C_Categorie;
import encheres.manager.corba.C_Enchere;
import encheres.manager.corba.C_Filtre;
import encheres.manager.corba.C_Produit;
import encheres.presentation.controleur.ListeProduit;


public class JPanelListerProduits extends JPanel {

	private JPanel jPanelFiltre = null;
	private JRadioButton jRadioButtonCategorie = null;
	private JRadioButton jRadioButtonSousCategories = null;
	private JComboBox jComboBoxCategories = null;
	private JRadioButton jRadioButtonTous = null;
	private JButton jButtonRefresh = null;
	private JScrollPane jScrollPaneProduits = null;
	private JTable jTableProduits = null;
	private JLabel jLabelListerProduits = null;
	
	private int sessionCourante = -1;
	private HashMap<Integer, JFrame> ensembleFenetres = new HashMap<Integer, JFrame>();
	
	public enum FILTRE {TOUS, PAR_CATEGORIE, PAR_SOUS_CATEGORIE};
	private ListeProduit controleurProduit = new ListeProduit();
	
	/**
	 * This method initializes 
	 * 
	 */
	public JPanelListerProduits(int idSession) {
		super();
		sessionCourante = idSession;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() {
        jLabelListerProduits = new JLabel();
        jLabelListerProduits.setBounds(new Rectangle(14, 16, 187, 26));
        jLabelListerProduits.setText("Liste des produits");
        jLabelListerProduits.setFont(new Font("Dialog", Font.BOLD, 18));
        this.setLayout(null);
        this.setSize(new Dimension(758, 750));
        this.add(jLabelListerProduits, null);
        this.add(getJPanelFiltre(), null);
        this.add(getJScrollPaneProduits(), null);
        gererAffichageRadioButton();
	}

	/**
	 * This method initializes jPanelFiltre	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelFiltre() {
		if (jPanelFiltre == null) {
			jPanelFiltre = new JPanel();
			jPanelFiltre.setLayout(null);
			jPanelFiltre.setBounds(new Rectangle(35, 57, 414, 140));
			jPanelFiltre.setBorder(BorderFactory.createTitledBorder("Filtre"));
			jPanelFiltre.add(getJRadioButtonCategorie(), null);
			jPanelFiltre.add(getJRadioButtonSousCategories(), null);
			jPanelFiltre.add(getJComboBoxCategories(), null);
			jPanelFiltre.add(getJRadioButtonTous(), null);
			jPanelFiltre.add(getJButtonRefresh(), null);
		}
		return jPanelFiltre;
	}

	/**
	 * This method initializes jRadioButtonCategorie	
	 * 	
	 * @return javax.swing.JRadioButton	
	 */
	private JRadioButton getJRadioButtonCategorie() {
		if (jRadioButtonCategorie == null) {
			jRadioButtonCategorie = new JRadioButton();
			jRadioButtonCategorie.setText("Par catégorie");
			jRadioButtonCategorie.setBounds(new Rectangle(122, 25, 102, 24));
			jRadioButtonCategorie.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					getJRadioButtonSousCategories().setSelected(false);
					getJRadioButtonTous().setSelected(false);
					String[] tabCategories = controleurProduit.listerCategoriesOuSousCategories(true);
					getJComboBoxCategories().removeAllItems();
					for(String categorie : tabCategories){
						jComboBoxCategories.addItem(categorie);
					}
					gererAffichageRadioButton();
				}
			});
		}
		return jRadioButtonCategorie;
	}

	/**
	 * This method initializes jRadioButtonSousCategories	
	 * 	
	 * @return javax.swing.JRadioButton	
	 */
	private JRadioButton getJRadioButtonSousCategories() {
		if (jRadioButtonSousCategories == null) {
			jRadioButtonSousCategories = new JRadioButton();
			jRadioButtonSousCategories.setText("Par sous-catégorie");
			jRadioButtonSousCategories.setBounds(new Rectangle(258, 25, 134, 24));
			jRadioButtonSousCategories
					.addActionListener(new java.awt.event.ActionListener() {
						public void actionPerformed(java.awt.event.ActionEvent e) {
							getJRadioButtonCategorie().setSelected(false);
							getJRadioButtonTous().setSelected(false);
							String[] tabCategories = controleurProduit.listerCategoriesOuSousCategories(false);
							getJComboBoxCategories().removeAllItems();
							for(String categorie : tabCategories){
								jComboBoxCategories.addItem(categorie);
							}
							gererAffichageRadioButton();
						}
					});
		}
		return jRadioButtonSousCategories;
	}

	/**
	 * This method initializes jComboBoxCategories	
	 * 	
	 * @return javax.swing.JComboBox	
	 */
	private JComboBox getJComboBoxCategories() {
		if (jComboBoxCategories == null) {
			jComboBoxCategories = new JComboBox();
			jComboBoxCategories.setBounds(new Rectangle(25, 62, 364, 25));
		} 
		return jComboBoxCategories;
	}

	/**
	 * This method initializes jRadioButtonTous	
	 * 	
	 * @return javax.swing.JRadioButton	
	 */
	private JRadioButton getJRadioButtonTous() {
		if (jRadioButtonTous == null) {
			jRadioButtonTous = new JRadioButton();
			jRadioButtonTous.setText("Tous");
			jRadioButtonTous.setBounds(new Rectangle(25, 25, 84, 21));
			jRadioButtonTous.setSelected(true);
			jRadioButtonTous.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					getJRadioButtonCategorie().setSelected(false);
					getJRadioButtonSousCategories().setSelected(false);
					gererAffichageRadioButton();
				}
			});
		}
		return jRadioButtonTous;
	}

	/**
	 * This method initializes jButtonRefresh	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonRefresh() {
		if (jButtonRefresh == null) {
			jButtonRefresh = new JButton();
			jButtonRefresh.setBounds(new Rectangle(165, 100, 98, 27));
			jButtonRefresh.setText("Rafraichir");
			jButtonRefresh.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if(!((getJRadioButtonCategorie().isSelected() || getJRadioButtonSousCategories().isSelected()) && getJComboBoxCategories().getSelectedIndex() == -1)) {
						
						try {
							// Récupérer les produits suivant le filtre choisi par l'utilisateur
							String[] headers = {"Ref", "Libellé", "Dernière enchère", "Echeance"};
							String[][] donnees;
							if(getJRadioButtonTous().isSelected()){
								donnees = controleurProduit.getListProduit(FILTRE.TOUS, (String)getJComboBoxCategories().getSelectedItem());
							} else if(getJRadioButtonCategorie().isSelected()){
								donnees = controleurProduit.getListProduit(FILTRE.PAR_CATEGORIE, (String)getJComboBoxCategories().getSelectedItem());
							} else {
								donnees = controleurProduit.getListProduit(FILTRE.PAR_SOUS_CATEGORIE, (String)getJComboBoxCategories().getSelectedItem());
							}
							// Mettre à jour jTableProduits
							DefaultTableModel data = (DefaultTableModel) jTableProduits.getModel();
							data.setDataVector(donnees, headers);
							jTableProduits.getColumnModel().getColumn(0).setMaxWidth(40);
							jTableProduits.getColumnModel().getColumn(2).setMinWidth(110);
							jTableProduits.getColumnModel().getColumn(2).setMaxWidth(110);
							jTableProduits.getColumnModel().getColumn(3).setMaxWidth(80);
							jTableProduits.repaint();
						} catch (EncheresUIException exception) {
							JOptionPane.showMessageDialog(jButtonRefresh.getRootPane(), exception.getMessage(), "Enchères - ERREUR", JOptionPane.ERROR_MESSAGE);
						}
					} else {
						System.out.println("RIEN N'EST SELECTIONNE !!");
					}
				}
			});
		}
		return jButtonRefresh;
	}

	/**
	 * This method initializes jScrollPaneProduits	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPaneProduits() {
		if (jScrollPaneProduits == null) {
			jScrollPaneProduits = new JScrollPane();
			jScrollPaneProduits.setBounds(new Rectangle(35, 215, 638, 160));
			jScrollPaneProduits.setViewportView(getJTableProduits());
		}
		return jScrollPaneProduits;
	}

	/**
	 * This method initializes jTableProduits	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTableProduits() {
		if (jTableProduits == null) {
			// initialise les données
			String[][] donnees;
			try {
				donnees = controleurProduit.getListProduit(FILTRE.TOUS, (String)getJComboBoxCategories().getSelectedItem());
			} catch (Exception e1) {
				e1.printStackTrace();
				donnees = new String[0][4];
				JOptionPane.showMessageDialog(jScrollPaneProduits.getRootPane(), "Erreur inconnue lors du chargement des produits.", "Enchères - Erreur", JOptionPane.ERROR_MESSAGE);
			} 
			String[] headers = {"Ref", "Libellé", "Dernière enchère", "Echeance"};
			DefaultTableModel data = new DefaultTableModel(donnees, headers);
			jTableProduits = new JTable(data);
			jTableProduits.getColumnModel().getColumn(0).setMaxWidth(40);
			jTableProduits.getColumnModel().getColumn(1).setMinWidth(110);
			jTableProduits.getColumnModel().getColumn(2).setMaxWidth(110);
			jTableProduits.getColumnModel().getColumn(3).setMaxWidth(80);
			jTableProduits.addMouseListener(new MouseListener() {
				
				public void mouseReleased(MouseEvent e) {}
				
				public void mousePressed(MouseEvent e) {}
				
				public void mouseExited(MouseEvent e) {}
				
				public void mouseEntered(MouseEvent e) {}
				
				public void mouseClicked(MouseEvent e) {
					gererAffichageDetailProduit();
					
				}
			});
		}
		return jTableProduits;
	}

	

	private void gererAffichageRadioButton() {
		getJComboBoxCategories().setEnabled(!getJRadioButtonTous().isSelected());
	}
	
	private void gererAffichageDetailProduit() {
		if(getJTableProduits().getSelectedRowCount() > 0) {
			try {
				int idProduit = Integer.valueOf(getJTableProduits().getValueAt(getJTableProduits().getSelectedRow(), 0).toString());
				if (!ensembleFenetres.containsKey(idProduit)) {
					C_Produit produit = CorbaManager.getManagerProduit().detailsProduit(idProduit);
					ensembleFenetres.put(idProduit, new UIDetailsProduit(produit, ensembleFenetres, sessionCourante));
				}
			} catch (NumberFormatException e) {
				JOptionPane.showMessageDialog(jButtonRefresh.getRootPane(), e.getMessage(), "Valeur incorrecte", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

	private String[][] getListProduit (FILTRE filtre) throws EncheresUIException{
		try {
			String[][] tabProduits = null;
			
	        // définir le filtre Corba qui servira à lister les produits.
	        C_Filtre filtreCorba;
	        int idCategorie = -1;
	        if(filtre == FILTRE.TOUS){
	        	filtreCorba = C_Filtre.Tous;
	        } else if(filtre == FILTRE.PAR_CATEGORIE || filtre == FILTRE.PAR_SOUS_CATEGORIE){
	        	filtreCorba = C_Filtre.ParCategorie;
	        	idCategorie = Integer.valueOf((((String)getJComboBoxCategories().getSelectedItem()).split("-"))[0]);
	        } else {
	        	filtreCorba = C_Filtre.Tous;
	        }
	    	C_Produit[] tabTousProduit = CorbaManager.getManagerProduit().listerProduitsAvecFiltre(filtreCorba, idCategorie);
	    	int taille = tabTousProduit.length;
	    	tabProduits = new String[taille][4];
	    	for(int i=0; i<taille; i++){
	    		// référence du produit
	    		tabProduits[i][0] = String.valueOf(tabTousProduit[i].id);
	    		// libellé du produit
	    		tabProduits[i][1] = tabTousProduit[i].nom;
	    		// enchère la plus récente du produit
	    		try {
	        		C_Enchere[] listEncheres = tabTousProduit[i].encheres;
	        		DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
	        		int tailleEnchere = listEncheres.length;
	        		if(tailleEnchere > 0){
	        			//récupérer la première date d'enchère
						Date dateCourante = format.parse(listEncheres[0].date);
						tabProduits[i][2] = String.valueOf(listEncheres[0].prix);
	        			// si la date courante d'enchère est > à première dateEnregistré alors enregistrer le prix
	        			for(C_Enchere enchereCourante : listEncheres){
	        				Date dateEnchere = format.parse(enchereCourante.date);
	        				if(dateCourante.before(dateEnchere)){
	        					tabProduits[i][2] = String.valueOf(enchereCourante.prix);
	        					dateCourante = dateEnchere;
	        				}
	        			}
	        		} else {
	        			// Il n'y a pas eu d'enchères sur ce produit.
	        			tabProduits[i][2] = "";
	        		}
	    		} catch (ParseException e) {
	    			tabProduits[i][2] = "";
					e.printStackTrace();
				}
	    		// échéance du produit
	    		tabProduits[i][3] = tabTousProduit[i].dateEcheance;
	    	}
	    	return tabProduits;
		} catch (Exception e) {
			e.printStackTrace();
			throw new EncheresUIException("Impossible de lister les produits", e);
		}
	}
	
	/**
	 * Liste les catégories ou les sous-categories dans un tableau exploitable par un objet JCombobox
	 * @param doitListerMeres vrai si ce sont les actégories mères qui doivent être listées, faux si ce sont les sous catégories
	 * @return le tableau des catégories.
	 */
	public String[] listerCategoriesOuSousCategories(final boolean doitListerMeres){
		String[] tabCategories;
		try {	        
	        C_Categorie[] listeCategoriesMeres = CorbaManager.getManagerCategorie().listerCategoriesMeres();
	        int taille = listeCategoriesMeres.length;
	        if(doitListerMeres) {
	        	tabCategories = new String[taille];
	        	for(int i=0; i<taille; i++){
	        		tabCategories[i] = listeCategoriesMeres[i].id+"-"+listeCategoriesMeres[i].nom;
	        	}
	        } else {
	        	List<C_Categorie> listTempCategorieFilles = new ArrayList<C_Categorie>();
	        	for (C_Categorie categorieMereCourante : listeCategoriesMeres){
	        		C_Categorie[] listeCategorieFilles = CorbaManager.getManagerCategorie().listerSousCategories(categorieMereCourante.id);
	        		for(C_Categorie categorieFilleCourante : listeCategorieFilles){
	        			listTempCategorieFilles.add(categorieFilleCourante);
	        		}
	        	}
	        	
	        	int tailleFille = listTempCategorieFilles.size();
	        	tabCategories = new String[tailleFille];
	        	for(int i=0; i<tailleFille; i++){
	        		C_Categorie categorie = listTempCategorieFilles.get(i);
        			tabCategories[i] = categorie.id+"-"+categorie.nom;
        		}
	        }
	        
		} catch (Exception e) {
			tabCategories = new String[0];
		}
		
		return tabCategories;
	}
	
}
